package com.otp.service.impl;

import com.otp.exception.BusinessException;
import com.otp.pojo.entity.Course;
import com.otp.pojo.entity.CourseJoin;
import com.otp.pojo.request.course.*;
import com.otp.service.CourseJoinService;
import com.otp.repository.CourseJoinRepository;
import com.otp.repository.CourseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CourseJoinServiceImpl implements CourseJoinService {
    @Autowired
    private CourseRepository courseRepository;
    @Autowired
    private CourseJoinRepository courseJoinRepository;

    @Override
    public CourseJoin joinCourse(CourseJoinRequest request) {
        courseRepository.findById(request.getCourseId())
                .orElseThrow(() -> new BusinessException("课程不存在"));

        CourseJoin existingJoin = courseJoinRepository.findByCourseIdAndStudentId(
                request.getCourseId(), request.getStudentId());

        if (existingJoin != null) {
            throw new BusinessException("已申请加入该课程");
        }

        CourseJoin courseJoin = new CourseJoin();
        courseJoin.setCourseId(request.getCourseId());
        courseJoin.setStudentId(request.getStudentId());
        courseJoin.setStatus("PENDING");

        courseJoinRepository.save(courseJoin);
        return courseJoin;
    }

    @Override
    public CourseJoin reviewJoin(CourseJoinReviewRequest request) {
        CourseJoin courseJoin = courseJoinRepository.findById(request.getId())
                .orElseThrow(() -> new BusinessException("课程加入请求不存在"));

        if (courseJoin == null) {
            throw new BusinessException("加入请求不存在");
        }
        courseJoin.setStatus(request.getStatus());
        courseJoinRepository.save(courseJoin);

        return courseJoin;
    }

    @Override
    public List<CourseJoin> listByCourseId(Long courseId) {
        return courseJoinRepository.findByCourseId(courseId);
    }

    @Override
    public List<CourseJoin> listByStudentId(Long studentId) {
        return courseJoinRepository.findByStudentId(studentId);
    }

    @Override
    public List<CourseJoin> listAll() {
        return courseJoinRepository.findAll();
    }

    @Override
    public CourseJoin getById(Long id) {
        return courseJoinRepository.findById(id)
                .orElseThrow(() -> new BusinessException("课程加入记录不存在"));
    }

    @Override
    public List<CourseJoin> listByStatus(String status) {
        return courseJoinRepository.findByStatus(status);
    }

    @Override
    public CourseJoin update(CourseJoinUpdateRequest request) {
        CourseJoin courseJoin = courseJoinRepository.findById(request.getId())
                .orElseThrow(() -> new BusinessException("课程加入记录不存在"));

        courseJoin.setCourseId(request.getCourseId());
        courseJoin.setStudentId(request.getStudentId());
        courseJoin.setStatus(request.getStatus());
        return courseJoinRepository.save(courseJoin);
    }

    @Override
    public void delete(Long id) {
        if (!courseJoinRepository.existsById(id)) {
            throw new BusinessException("课程加入记录不存在");
        }
        courseJoinRepository.deleteById(id);
    }
}
